package com.tedu.API.ee;

import org.junit.Test;

import java.io.FileOutputStream;

/**
 * 流---传输数据---传输数据过程绝对不能出错【处理手段】
 * 标准流结合异常----标准IO
 *
 * 异常
 * Java面向对象语言，程序中所出现的所有错误，定义为对象【处理对应错误】
 *
 * Throwable顶级异常超类
 *
 * Exception异常：描述程序级别的错误----有解决方案
 *               编译期：RunTimeException异常表示类
 *                      FileOutputStream创建对象---波浪线---抛出方法之外 throw
 *               检查异常：通常都是编译器检查处理，程序直接报错，抛出
 *               解决方法：①捕获异常(*)
 *                        ②抛出异常---抛出方法之外--打印控制台
 *
 *               运行期：控制台直接显示异常对象【异常对象名字，产生原因】
 *               非检查异常：控制台输出异常对象名称，RunTimeException异常标识类
 *
 *               最后了解【throw与throws---RunTimeException】
 *
 *
 * Error错误：描述系统级别的错误----出现---程序宕机
 *           出现概率非常低--->递归：自己调自己【方法】--->
 */
public class EE {
    /**
     * Error  错误----程序严重错误
     * 模拟：方法调方法---栈溢出错误
     * StackOverflowError栈溢出错误
     *
     * while(true){
     *     拼接字符串对象
     * }
     */
    public static void method(){
        method();
    }
    @Test
    public void testError(){
        EE.method();
    }

    /**
     * Exception异常：检查异常【出现编译期】---代码报红色波浪线
     *               两种处理手段：①捕获异常
     *               语法：try{
     *                   怀疑代码可能有异常或者提示异常
     *               }catch(小异常名字 e){
     *               e.printStacktrace(); 打印异常信息
     *               }catch(中异常名字 e){
     *               e.printStacktrace(); 打印异常信息
     *               }catch(大异常名字 e){
     *               e.printStacktrace(); 打印异常信息
     *               }finally{
     *             一定执行代码块
     *                      }
     * 这个不用手写 选中用CTRL+ALT+T快捷键能调出来
     *
     *
     *                           ②抛出异常  throws  异常名字【并未解决】
     *
     *                  考试题：throw与throws的区别------Person查看
     *                  异常关键字：throw
     *                            throws
     *
     *               非检查异常【出现运行期】---代码无错误--控制台
     *
     *  异常：FileNotFoundException   文件不存在异常
     *  产生原因：路径写错、文件名写错
     *  异常：NullPointerException    空指针异常
     *   产生原因：字符串为空，数组：值为空，集合：元素为空【存在null值】
     *  异常：StringIndexOutOfBoundsException  字符串下标越界异常
     *    产生原因：字符串下标没有对应的字符
     *  异常：NumberFormatException   数字转换异常
     *    产生原因:字符串不是正确类型
     */
    @Test
    public void testException(){
        //检查异常【出现编译期】---代码报红色波浪线
    //    FileOutputStream fis=new FileOutputStream("");
        //非检查异常【出现运行期】---代码无错误--控制台
        try {
            String str="a";
            str.length();
            str.charAt(1);
            Integer.parseInt(str);    //解析字符串--转换为对应类型
        }catch(StringIndexOutOfBoundsException e){
            e.printStackTrace(); //打印异常对象信息
            System.out.println("字符串小异常：下标越界异常");
        }
        catch (NumberFormatException e) {
            e.printStackTrace();  //打印异常信息
            System.out.println("字符串小异常~~");
        }catch(Exception e){
            e.printStackTrace();
        }
        finally {
            System.out.println("一定执行代码块~");
        }
    }

    /**
     * 作业1：写出5个【非检查】异常的代码示例
     * 提示：查API---java.lang 异常
     *      字符串 包装类 集合 IO流
     */
    @Test
    public void testHomeWork1(){
        /**
         * 异常：ActivationException  激活界面使用的常规异常。
         *     产生原因：数据处理错误，配置文件缺失或损坏，类路径问题(类路径冲突或者缺少 JAF 相关库文件)
         *
         * 异常：JAXBException    这是所有JAXB异常的根异常类。
         *     产生原因：XML模式相关问题(缺少XML模式定义文件,XML模式文件错误),Java类与XML结构不匹配
         *
         * 异常：PropertyVetoException  当对属性的建议更改表示不可接受的值时抛出的异常
         *     产生原因：JavaBean属性约束(验证规则冲突，业务逻辑约束),监听器机制触发(多个监听器冲突,监听器实现错误)
         *
         * 异常：TimeoutException  阻塞操作超时时抛出异常
         *     产生原因：网络请求超时，数据库操作超时，并发编程中的任务超时，资源获取超时
         *
         * 异常：UnmodifiableClassException  当一个指定的类不能被修改时被Instrumentation.redefineClasses的实现抛出
         *    产生原因：一个类所在的模块在这个限制范围之外，并且试图对这个类进行修改
         *
         */

        /**
         * final与finally的区别
         * final【最终】 修饰类 不可改变类  修饰属性 不可以改变值【常量】    修饰方法 方法不可重写，可以重载
         * finally 处理异常块：关闭流
         */

    }
}


